<?php

/**
 * @package    embryo
 * @subpackage libraries
 * @author     Alessandro Pelliciari
 * @version    SVN: $Id$
 */

/**
 * Container è la classe che gestisce il dependency injection container dell'applicativo.
 */
class Container {

    /**
     * @var array Array di riferimenti e variabili che vengono salvati per poi essere richiamati.
     */
    protected $values = array();

    /**
     * Setta un parametro od un oggetto
     *
     * @param string $id    L'identificatore unico del parametro o dell'oggetto
     * @param mixed $value  Il valore del parametro o il riferimento all'oggetto
     */
    function __set($id, $value) {
        $this->values[$id] = $value;

    }

    /**
     * Ritorna un parametro o un oggetto. Se l'oggetto non è definito ma esiste la classe corrispondente, crea un nuovo oggetto o richiama il metodo per generare il singleton.
     *
     * @param string $id L'identificatore unico del parametro o dell'oggetto
     *
     * @return mixed Il valore del parametro o il riferimento all'oggetto
     *
     * @throws InvalidArgumentException Se l'identificatore non è definito e non è una classe
     */
    function __get($id) {
        if (!isset($this->values[$id])) {
            //forse lo vuoi ottenere
            //quindi devo capire se è singleton o meno

            if (class_exists($id)) {
                if (method_exists($id, "get_instance")) {
                    //è un singleton
                    return call_user_func_array(array($id, "get_instance"), array($this));
                }
                else {

                    $this->values[$id] = new $id($this);
                    return $this->values[$id];
                }
            }
            else
                throw new InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id));
        }

        return $this->values[$id];
    }

    /**
     * Controlla se un parametro od un oggetto è settato.
     *
     * @return boolean
     */
    function __isset($id) {
        return isset($this->values[$id]);
    }
}